Condvar

#include <zephyr/kernel.h>

K_CONDVAR_DEFINE(user_condvar);
K_MUTEX_DEFINE(user_mutex_c);

static bool condition_met = false;

void consumer_handle() {
  printk("Consumer: Thread started. acquiring mutex...\n");

  k_mutex_lock(&user_mutex_c, K_FOREVER);

  while (!condition_met) {
    printk("Consumer: Condition not met. Wait on condvar...\n");

    k_condvar_wait(&user_condvar, &user_mutex_c, K_FOREVER);

    printk("Consumer: Woke up! Re-checking the condition...\n");
  }

  printk("Consumer: Condition is met! Done.\n");

  k_mutex_unlock(&user_mutex_c);
}

void producer_handle() {
  k_sleep(K_SECONDS(2));

  printk("Producer: Preparing to change condtion...\n");

  k_mutex_lock(&user_mutex_c, K_FOREVER);

  condition_met = true;

  printk("Producer: Condition changed! Signaling condvar...\n");

  k_condvar_signal(&user_condvar);

  k_mutex_unlock(&user_mutex_c);
}
K_THREAD_DEFINE(condvar_cons_id, 1024, consumer_handle, NULL, NULL, NULL, 2, 0,
                0);

K_THREAD_DEFINE(condvar_prod_id, 1024, producer_handle, NULL, NULL, NULL, 2, 0,
                0);x

Last modified: 2026-05-24